package com.bjpowernode.javase.collection;

import java.util.HashSet;
import java.util.Set;
/*
1、向Map集合中存取元素，都是先调用key的hashCode方法，然后在调用equals方法。
equals方法有可能调用也可能不调用。
    那put<k,v>举例：
        不调用equals：k.hashCode()反回Hash值，Hash值经过哈希算法转换成数组下标
                数组下标位置上为null，equals方法不需要调用。
    那get(K):
        不调用equals：k.hashCode()反回Hash值，Hash值经过哈希算法转换成数组下标
                数组下标位置上为null，equals方法不需要调用。
 2、如果一个类的equals方法重写了，那么hashCode()方法必须重写。
 并且equals()方法返回值为true，那么hashCode()返回值必须一样。
    equals()方法返回值为true说明在同一个单向链表上，同一个单向链表上的hashCode()值相同。

3、hashCode()方法和equals()方法不用研究了，直接使用equals方法直接生成，但是在这两个方法需要同时生成。


 */
public class HashMapTest02 {
    public static void main(String[] args) {
        Student1 s1 = new Student1("zhangsan1");
        Student1 s2 = new Student1("zhangsan1");
        Student1 s3 = new Student1("zhangsan3");

        //重写equals方法之前比较结果是false
        //System.out.println(s1.equals(s2));

        //重写equals方法之后比较结果是true
        System.out.println(s1.equals(s2));

        System.out.println("s1的hashCode：" +s1.hashCode());
        System.out.println("s2的hashCode：" +s2.hashCode());
        System.out.println("s3的hashCode：" +s3.hashCode());

        //s1.equals(s2)结果已经为true了，表示s1与s2是相同的，
        // 那么往hashSet集合中放的话只能放进去一个。
        Set<Student1> student1s = new HashSet<>();
        student1s.add(s1);
        student1s.add(s2);

        //没重写hashCode()
        System.out.println(student1s.size());//这个结果按说应该是1，但是结果为2
    }
}
